/**
 * ===================================
 * 资源预加载场景 (Preloader.js)
 * ===================================
 * 
 * 功能说明：
 * - 负责加载游戏所需的所有资源（图片、音频、字体、动画等）
 * - 显示加载进度信息
 * - 创建自定义位图字体
 * - 加载完成后自动跳转到启动画面场景
 * 
 * 重要提示：
 * - 这些资源也可以在其他场景中按需加载
 * - 建议将大型资源分散到各个场景中加载，避免首次加载时间过长
 * 
 * 作者：游戏开发团队
 * 创建时间：2024年
 */

// 导出资源预加载场景类，继承自Phaser.Scene
export class Preloader extends Phaser.Scene {
    
    /**
     * 构造函数 - 初始化场景
     * 设置场景的唯一标识符为 "Preloader"
     */
    constructor() {
        super({ key: "Preloader" });
    }

    /**
     * ===== preload() 生命周期方法 =====
     * 
     * 在场景启动时自动调用，用于加载所有游戏资源
     * 加载顺序不影响游戏逻辑，但建议按类型分组便于维护
     */
    preload() {
        // ===== 设置资源根路径 =====
        this.load.setPath("assets");  // 所有资源文件的基础路径（相对于public目录）

        // ===== 加载基础UI资源 =====
        this.load.image("logo", "logo.png");           // 游戏Logo图片
        this.load.image("floor");                      // 地面图片（自动推断.png扩展名）
        this.load.image("background", "background.png"); // 背景图片

        // ===== 加载玩家相关资源 =====
        this.load.image("player", "player/player.png"); // 玩家飞船静态图片
        
        // 加载玩家推进器火焰动画（使用纹理图集）
        this.load.atlas(
            "propulsion-fire",                                    // 纹理图集ID
            "player/propulsion/propulsion-fire.png",             // 图片文件路径
            "player/propulsion/propulsion-fire_atlas.json"       // 图集数据文件（包含每帧的位置信息）
        );
        
        // 加载推进器火焰动画配置
        this.load.animation(
            "propulsion-fire-anim",                              // 动画ID
            "player/propulsion/propulsion-fire_anim.json"        // 动画配置文件（包含帧序列、时间等）
        );

        // ===== 加载子弹相关资源 =====
        this.load.image("bullet", "player/bullet.png");  // 玩家子弹图片
        this.load.image("flares");                        // 子弹爆炸火花效果图片

        // ===== 加载敌人相关资源 =====
        // 蓝色敌人纹理图集（包含多个动画帧）
        this.load.atlas(
            "enemy-blue",                                         // 敌人纹理图集ID
            "enemies/enemy-blue/enemy-blue.png",                 // 敌人图片文件
            "enemies/enemy-blue/enemy-blue_atlas.json"           // 敌人图集数据文件
        );
        
        // 蓝色敌人动画配置
        this.load.animation(
            "enemy-blue-anim",                                   // 敌人动画ID
            "enemies/enemy-blue/enemy-blue_anim.json"           // 敌人动画配置文件
        );
        
        this.load.image("enemy-bullet", "enemies/enemy-bullet.png"); // 敌人子弹图片

        // ===== 加载字体资源 =====
        // 加载位图字体（用于显示分数、时间等UI文本）
        this.load.bitmapFont(
            "pixelfont",                    // 字体ID
            "fonts/pixelfont.png",          // 字体图片文件（包含所有字符）
            "fonts/pixelfont.xml"           // 字体配置文件（包含每个字符的位置和尺寸）
        );
        
        // 加载自定义字体图片（用于创建RetroFont）
        this.load.image("knighthawks", "fonts/knight3.png");

        // ===== 监听加载进度事件 =====
        // 在控制台显示加载进度，便于调试和监控
        this.load.on("progress", (progress) => {
            // progress 是0-1之间的小数，表示加载完成的百分比
            console.log("Loading: " + Math.round(progress * 100) + "%");
        });
        
        // ===== 其他可用的加载事件 =====
        /*
        this.load.on("start", () => {
            console.log("开始加载资源...");
        });
        
        this.load.on("complete", () => {
            console.log("所有资源加载完成！");
        });
        
        this.load.on("filecomplete", (key, type, data) => {
            console.log(`文件加载完成: ${key} (${type})`);
        });
        
        this.load.on("loaderror", (file) => {
            console.error(`文件加载失败: ${file.key}`);
        });
        */
    }

    /**
     * ===== create() 生命周期方法 =====
     * 
     * 在所有资源加载完成后自动调用
     * 用于创建自定义字体、初始化游戏对象等后处理工作
     */
    create() {
        // ===== 创建自定义位图字体 =====
        // 使用RetroFont创建像素风格的字体，适合复古游戏
        const retroFontConfig = {
            image: 'knighthawks',                           // 使用的字体图片ID
            width: 31,                                      // 每个字符的宽度（像素）
            height: 25,                                     // 每个字符的高度（像素）
            chars: Phaser.GameObjects.RetroFont.TEXT_SET6, // 字符集（包含数字、字母、符号）
            charsPerRow: 10,                               // 每行包含的字符数量
            spacing: { x: 1, y: 1 }                        // 字符间距（水平和垂直）
        };
        
        // 解析字体配置并添加到缓存中，供其他场景使用
        this.cache.bitmapFont.add(
            'knighthawks',                                  // 字体缓存ID
            Phaser.GameObjects.RetroFont.Parse(this, retroFontConfig) // 解析后的字体对象
        );

        // ===== 跳转到下一个场景 =====
        // 所有资源加载完成后，自动启动启动画面场景
        this.scene.start("SplashScene");
        
        // ===== 其他可选的场景切换方式 =====
        /*
        // 如果需要传递数据到下一个场景：
        this.scene.start("SplashScene", { 
            loadedAssets: this.cache.list,
            loadTime: Date.now() - this.startTime 
        });
        
        // 如果需要并行启动多个场景：
        this.scene.launch("BackgroundMusicScene");
        this.scene.start("SplashScene");
        */
    }
}